package serverb.comunicacion;


//import cliente.comunicacion.ICliente;


import java.net.MalformedURLException;
import java.rmi.AlreadyBoundException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.server.UnicastRemoteObject;
import java.sql.SQLException;
import java.util.Date;
import java.util.Vector;
import server.dominio.Beneficiario;
import server.dominio.Cita;
import server.dominio.Medico;
import server.dominio.Usuario;
import server.excepciones.BeneficiarioInexistenteException;
import server.excepciones.BeneficiarioNoExistenteException;
import server.excepciones.BeneficiarioYaExistenteException;
import server.excepciones.CitaNoValidaException;
import server.excepciones.FechaNoValidaException;
import server.excepciones.MedicoInexistenteException;
import server.excepciones.MedicoNoExistenteException;
import server.excepciones.MedicoYaExistenteException;
import server.excepciones.UsuarioNoExistenteException;
import server.excepciones.UsuarioYaExistenteException;
import server.excepciones.VolanteNoValidoException;
import serverb.negocio.Controlador_G_CitasB;


import serverb.negocio.Controlador_G_UsuariosB;
import serverb.negocio.Controlador_HorarioB;
import serverb.negocio.Controlador_ServidorB;


import serverb.presentacion.JF_ServidorB;



public class ServidorB extends UnicastRemoteObject implements IServidorB {

	/**
	 * 
	 */
    private static final long serialVersionUID = 1L;
//    private Hashtable<ID_iSESION, iCliente> sesiones;

    private Controlador_ServidorB c_servidor;

    private Controlador_G_UsuariosB c_g_usuarios;
    private Controlador_HorarioB c_horario;
    private Controlador_G_CitasB c_g_citas;

    public ServidorB(JF_ServidorB ventanav) throws RemoteException {
        super();
        LocateRegistry.createRegistry(3000);



        //Inicialización del controlador
        c_servidor= new Controlador_ServidorB(this, ventanav);

        c_g_usuarios= new Controlador_G_UsuariosB(c_servidor);
        c_horario= new Controlador_HorarioB(c_servidor);
        c_g_citas= new Controlador_G_CitasB(c_servidor, c_g_usuarios, c_horario);
    }

    public void conectar() throws MalformedURLException, RemoteException {
        try {
            Naming.bind("rmi://localhost:3000/ServidorB", this);
            c_servidor.log("Naming_bind: rmi://localhost:3000/ServidorB OK");
        }
        catch (AlreadyBoundException ex) {
            Naming.rebind("rmi://localhost:3000/ServidorB", this);
            c_servidor.log("Naming_rebind: rmi://localhost:3000/ServidorB OK");
        }

    }

    public void desconectar() throws RemoteException, MalformedURLException, NotBoundException {
        Naming.unbind("rmi://localhost:3000/ServidorB");
        c_servidor.log("Naming_unbind: rmi://localhost:3000/ServidorB OK");
    }




    @Override
    public void crear(Beneficiario beneficiario)
                    throws RemoteException, BeneficiarioYaExistenteException,
                    SQLException, Exception {

        c_g_usuarios.crearbeneficiario(beneficiario);
    }
    @Override
    public void crear(Medico medico) throws RemoteException,
                    MedicoYaExistenteException, SQLException, Exception {
            // TODO Auto-generated method stub
           c_g_usuarios.crearmedico(medico);
    }


    @Override
    public void modificar(Medico medico) throws RemoteException,
                    MedicoNoExistenteException, SQLException,
                    MedicoYaExistenteException, Exception {
            // TODO Auto-generated method stub
        c_g_usuarios.modificarMedico(medico);
    }
    @Override
    public void modificar(Beneficiario beneficiario)
                    throws RemoteException, BeneficiarioNoExistenteException,
                    SQLException,
                    BeneficiarioYaExistenteException, Exception{
            // TODO Auto-generated method stub
        c_g_usuarios.modificarBeneficiario(beneficiario);

    }
    public void modificarCalendario(Medico medico, Vector<Date> dias, Date horaDesde, Date horaHasta, Medico sustituto) throws RemoteException, MedicoInexistenteException, Exception{
 //       c_horario.insertarDatos(medico, dias, horaDesde, horaHasta);
        c_horario.insertarDatos(medico, dias, horaDesde, horaHasta);
    }



    public void eliminar(Beneficiario beneficiario) throws RemoteException, BeneficiarioNoExistenteException, SQLException, Exception {
        c_g_usuarios.eliminarbeneficiario(beneficiario);
    }
    @Override
    public void eliminar(Medico medico) throws RemoteException,
                    MedicoNoExistenteException, SQLException, Exception {
           c_g_usuarios.eliminarmedico(medico);

    }


    public void crear(Usuario usuario) throws RemoteException, UsuarioYaExistenteException, SQLException, Exception{
        c_g_usuarios.crearUsuario(usuario);
    }

    public void modificar(Usuario usuario) throws RemoteException, MedicoNoExistenteException, SQLException, UsuarioYaExistenteException, MedicoYaExistenteException, UsuarioNoExistenteException {
        c_g_usuarios.modificarUsuario(usuario);
    }

    public void mensajeAuxiliar(long idSesion, long codigoDeMensaje, Object informacion) throws RemoteException, Exception {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public void borrarUsuario(Usuario usuario) throws RemoteException, UsuarioNoExistenteException, SQLException, Exception{
        c_g_usuarios.borrarUsuario(usuario);
    }

    public void modificarM(Usuario usuario) throws UsuarioYaExistenteException, SQLException, UsuarioNoExistenteException, MedicoNoExistenteException, Exception  {
        c_g_usuarios.modificarUsuarioM(usuario);
    
    }

    public void refrescar(Medico medico) throws RemoteException, Exception {
        c_horario.formatearhorario(medico);
    }

    public void pedirCita(Beneficiario beneficiario, String idMedico, Date fechayHora) throws RemoteException, BeneficiarioInexistenteException, MedicoInexistenteException, FechaNoValidaException, SQLException, Exception {
        c_g_citas.pedirCita(beneficiario, idMedico, fechayHora);
    }

    public void pedirCita(Beneficiario beneficiario, long idVolante, Date fechayHora) throws RemoteException, BeneficiarioInexistenteException, MedicoInexistenteException, FechaNoValidaException, VolanteNoValidoException, SQLException, Exception {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public void anularCita(Cita cita) throws RemoteException, CitaNoValidaException, SQLException, Exception {
        c_g_citas.anularCita(cita);
    }

}

